package com.doit.day05

import org.apache.commons.lang3.RandomUtils

object _07_闭包和柯里化 {
  def main(args: Array[String]): Unit = {
    val fx = (a: Int, b: Int) => {
      val abc = 10
      a + b
    }

    println(fx(1, 2))


    val fxx = (a: Int) => {
      (b: Int) => a + b
    }

    val res = fxx(3)(10)


    //闭包检查
    val f = () => {
      var p = RandomUtils.nextInt(1, 10)
      val inner = () => {
        p += 1 //这个p不会垃圾回收
        p
      }
      inner
    }
    println(f()())
    println(f()())
    println(f()())
    println(f()())

    //柯里化
    def add(a: Int)= {
      (b:Double)=>{
      }
    }

    //柯里化的写法 将一个参数列表转换成多个参数列表进行传参
    def add1(a: Int)(b: Double) = {
      a * b
    }

    //用第一个括号确定一个函数(),()()

    //1.可以减少参数的传递
    //2.更好得做类型得推断
/*    add(100, 0.8)
    add(100, 0.7)
    add(100, 0.6)
    add(100, 0.9)*/
    val temp: Double => Double = add1(100)
    temp(0.9)
    temp(0.8)
    temp(0.7)
    temp(0.6)
    temp(0.5)

    //可以更好得类型推断
//    val lion = Lion(1,"辛巴",2)
/*    def sayHello(lion:Lion,i: Int): Unit ={
      println("hello")
    }
    */

    class A{
      class B
    }

    //不能够类型得推断
/*    def abc(a:A,b:a.B)={

    }

    //柯里化可以更好的做类型得推断
    def abcd (a:A)(b:a.B)={

    }*/




  }
}
